/*
 * @Author: panzhiwei 749458928@qq.com
 * @Date: 2024-01-28 22:46:20
 * @LastEditors: panzhiwei 749458928@qq.com
 * @LastEditTime: 2024-01-31 11:24:05
 * @FilePath: /2DDemo/assets/Script/weapon/PoisonArrow.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
// PoisonArrow.ts
import { Arrow } from './Arrow';
import { Enemy } from '../Enemy/Enemy';
import { _decorator, Node, Collider2D, IPhysics2DContact, Vec3 } from 'cc';
const { ccclass, property } = _decorator;

// 毒箭-形状较大，会产生爆炸，范围内的敌军都会受到伤害
@ccclass('PoisonArrow')
export class PoisonArrow extends Arrow {
    @property
    public attackRadius: number = 100; // 毒箭的攻击范围

    // 重写碰撞检测方法
    onBeginContact(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
        console.log('onBeginContact of PoisonArrow');

        // 检查是否与敌人碰撞
        if (!this.isDestroyed && otherCollider.node.name === 'enemy') {
            // 处理毒箭的特殊攻击效果
            this.handlePoisonAttack(otherCollider.node);

            // 销毁毒箭
            setTimeout(() => {
                if (selfCollider && selfCollider.node && selfCollider.node.isValid) {
                    this.isDestroyed = true;
                    selfCollider.node.destroy();
                }
            }, 0);
        }
    }

    // 处理毒箭的特殊攻击效果
    handlePoisonAttack(hitEnemy: Node) {
        // 在此实现毒箭的攻击逻辑，包括对周围敌人造成伤害
        // 例如，检测一定范围内的所有敌人，并对它们造成伤害
        // ...
        // 获取毒箭击中点的位置
        const hitPosition = hitEnemy.position;

        // 获取敌人所在的场景或父节点
        const scene = hitEnemy.parent;

        // 检测一定范围内的敌人
        const enemiesInRange = this.getEnemiesInRange(scene, hitPosition, this.attackRadius);

        // 对每个在范围内的敌人造成伤害
        enemiesInRange.forEach(enemy => {
            // 假设敌人组件有一个 takeDamage 方法
            let enemyScript = enemy.getComponent(Enemy);
            if (enemyScript) {
                // 例如，创建一个位于原点的 Vec3 对象
                let origin = new Vec3(0, 0, 0);
                enemyScript.takeDamage(this.attackPower,origin);
            }
        });
    }

    // 辅助方法：获取一定范围内的敌人
    getEnemiesInRange(scene: Node, center: Vec3, radius: number): Node[] {
        // 在此实现检测逻辑
        // 示例：遍历场景中的所有敌人节点，检查它们是否在范围内
        let enemiesInRange = [];
        scene.children.forEach(child => {
            if (child.name === 'enemy' && Vec3.distance(center, child.position) <= radius) {
                enemiesInRange.push(child);
            }
        });
        return enemiesInRange;
    }

}
